package com.zuowei.ycy.user.alipay;

import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.alipay.sdk.app.PayTask;
import com.and.yzy.frame.util.AppManger;
import com.and.yzy.frame.util.Toolkit;
import com.orhanobut.logger.Logger;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 支付宝接口封装类<br/>
 * *必须继承{@link com.and.yzy.frame.base.BaseFrameAty}<br/>
 * 在Manifest文件中添加一个Activity：<br/>
 * &ltactivity <br/>
 * android:name="com.alipay.sdk.app.H5PayActivity"<br/>
 * android:configChanges="orientation|keyboardHidden|navigation"<br/>
 * android:exported="false"<br/>
 * android:screenOrientation="behind"<br/>
 * android:windowSoftInputMode="adjustResize|stateHidden"<br/>
 * /><br/>
 * 添加权限：<br/>
 * ACCESS_COARSE_LOCATION<br/>
 * READ_PHONE_STATE<br/>
 * WRITE_EXTERNAL_STORAGE
 * 
 * @author Zero @date 2014年12月14日
 * @version 1.0
 */
public class AliPay implements Callback, Runnable {

	private final int WHAT = 0x23;

	private Handler handler;
	private Thread thread;

	private String total_fee;
	private String body;
	private String out_trade_no;
	private String subject;
	private String outTime = "30";
	private String extern_token;
	private String return_url = "m.alipay.com";
	private String notify_url = "http://notify.msp.hk/notify.htm";
	private boolean expressGateway;
	private AliPayCallBack payCallBack;

	/**
	 * 
	 * @param subject
	 *            要支付的商品的名称 ， null-充值金额
	 * @param body
	 *            要支付的商品的详情 ， null-充值
	 * @param total_fee
	 *            要支付的价钱 ， 不能为null
	 * @param payCallBack
	 *            支付成功后的回调方法
	 */
	public AliPay(String subject, String body, String total_fee, String out_trade_no, AliPayCallBack payCallBack) {
		handler = new Handler(this);
		thread = new Thread(this);
		this.total_fee = total_fee;
		this.subject = subject;
		this.body = body;
		this.out_trade_no = out_trade_no;
		this.payCallBack = payCallBack;
	}

	/**
	 *
	 * @param subject
	 *            要支付的商品的名称 ， null-充值金额
	 * @param body
	 *            要支付的商品的详情 ， null-充值
	 * @param total_fee
	 *            要支付的价钱 ， 不能为null
	 */
	public AliPay(String subject, String body, String total_fee, String out_trade_no) {
		handler = new Handler(this);
		thread = new Thread(this);
		this.total_fee = total_fee;
		this.subject = subject;
		this.body = body;
		this.out_trade_no = out_trade_no;
	}

	/**
	 * 设置异步通知服务器的URl
	 * @param notify_url
	 */
	public void setNotifyUrl(String notify_url){
		this.notify_url =notify_url;
	}


	/**
	 * 设置设置未付款交易的超时时间<br/>
	 * 默认30分钟，一旦超时，该笔交易就会自动被关闭<br/>
	 * 时间单位为分钟
	 */
	public void setOutTime(String outTime) {
		this.outTime = outTime;
	}

	/**
	 * 设置alipay_open_id<br/>
	 * 此id为经过快登授权获取到<br/>
	 * 设置此参数用户将使用授权的账户进行支付<br/>
	 * 默认不适用
	 */
	public void setExtern_token(String extern_token) {
		this.extern_token = extern_token;
	}

	/** 设置支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空 */
	public void setReturn_url(String return_url) {
		this.return_url = return_url;
	}

	/** 是否调用银行卡支付（需要签约《无线银行卡快捷支付》才能使用） ，默认不适用 */
	public void setIsUserExpressGateway(boolean expressGateway) {
		this.expressGateway = expressGateway;
	}

	private String getOrderInfo() {
		// 签约合作者身份ID
		String orderInfo = "partner=" + "\"" + Toolkit.getConfigProperties("DEFAULT_PARTNER") + "\"";
		// 签约卖家支付宝账号
		orderInfo += "&seller_id=" + "\"" + Toolkit.getConfigProperties("DEFAULT_SELLER") + "\"";
		// 商户网站唯一订单号
		orderInfo += "&out_trade_no=" + "\"" + (TextUtils.isEmpty(out_trade_no) ? getOutTradeNo() : out_trade_no) + "\"";
		// 商品名称
		orderInfo += "&subject=" + "\"" + (TextUtils.isEmpty(subject) ? "充值金额" : subject) + "\"";
		// 商品详情
		orderInfo += "&body=" + "\"" + (TextUtils.isEmpty(body) ? "充值" : body) + "\"";
		// 商品金额
		orderInfo += "&total_fee=" + "\"" + total_fee + "\"";
		// 服务器异步通知页面路径
		orderInfo += "&notify_url=" + "\"" + notify_url + "\"";
		// 服务接口名称， 固定值
		orderInfo += "&service=\"mobile.securitypay.pay\"";
		// 支付类型， 固定值
		orderInfo += "&payment_type=\"1\"";
		// 参数编码， 固定值
		orderInfo += "&_input_charset=\"utf-8\"";
		// 设置未付款交易的超时时间
		// 默认30分钟，一旦超时，该笔交易就会自动被关闭。
		// 取值范围：1m～15d。
		// m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
		// 该参数数值不接受小数点，如1.5h，可转换为90m。
		orderInfo += "&it_b_pay=\"" + outTime + "m\"";
		// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
		if (!TextUtils.isEmpty(extern_token))
			orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
		// 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
		orderInfo += "&return_url=\"" + return_url + "\"";
		// 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
		if (expressGateway)
			orderInfo += "&paymethod=\"expressGateway\"";
		Logger.e(orderInfo);
		return orderInfo;
	}

	/** 生成商户订单号 */
	private String getOutTradeNo() {
		SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
		Date date = new Date();
		String key = format.format(date);

		Random r = new Random();
		key = key + r.nextInt();
		key = key.substring(0, 15);
		String regEx = "[^0-9]";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(key);
		return m.replaceAll("").trim();
	}

	/**
	 * 对订单信息进行签名
	 * 
	 * @param content
	 *            待签名订单信息
	 */
	public String sign(String content) {
		return SignUtils.sign(content, Toolkit.getConfigProperties("PRIVATE"));
	}

	/** 获取签名方式 */
	public String getSignType() {
		return "sign_type=\"RSA\"";
	}

	/** 获取SDK版本号 */
	public void getSDKVersion() {
		PayTask payTask = new PayTask(AppManger.getInstance().getTopActivity());
		String version = payTask.getVersion();
		Toast.makeText(AppManger.getInstance().getTopActivity(), version, Toast.LENGTH_SHORT).show();
	}

	/** 调用支付宝充值页面 */
	public void pay() {
		thread.start();
	}

	@Override
	public boolean handleMessage(Message msg) {
		switch (msg.what) {
		case WHAT:
			PayResult payResult = new PayResult((String) msg.obj);
			String resultStatus = payResult.getResultStatus();
			if (TextUtils.equals(resultStatus, "9000")) { // 支付成功
				if (payCallBack!=null) {
					payCallBack.onComplete();
				}
			} else { // 没有支付成功
				if (TextUtils.equals(resultStatus, "8000")) { // 等待支付结果确认
					if (payCallBack!=null) {
						payCallBack.onProcessing();
					}
				} else { // 支付失败
					if (payCallBack!=null) {
						payCallBack.onFailure();
					}
				}
			}
			break;
		}
		return false;
	}

	@Override
	public void run() {
		// 订单
		String orderInfo = getOrderInfo();
		// 对订单做RSA 签名
		String sign = sign(orderInfo);
		try {
			// 仅需对sign 做URL编码
			sign = URLEncoder.encode(sign, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		// 完整的符合支付宝参数规范的订单信息
		final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
		// 构造PayTask 对象
		PayTask alipay = new PayTask(AppManger.getInstance().getTopActivity());
		// 调用支付接口，获取支付结果
		String result = alipay.pay(payInfo);
		Log.i("Alipay", "result = " + result);
		Message msg = new Message();
		msg.what = WHAT;
		msg.obj = result;
		handler.sendMessage(msg);
	}

	public interface AliPayCallBack {
		/** 当支付成功时的回调函数 */
		void onComplete();

		/** 当支付失败时的回调函数（包括用户主动取消支付，或者系统返回的错误） */
		void onFailure();

		/**
		 * 当等待支付结果确认时的回调函数<br/>
		 * 最终交易是否成功以服务端异步通知为准（小概率状态）
		 */
		void onProcessing();
	}

}
